// 引入 - router 进行路由动态扩展
import router, { resetRouter } from '@/router'; // eslint-disable-line
// 引入 - 基础路由 & 异步路由
import { constantRoutes, redirect404, asyncRoutes } from '@/router/routes';
// 引入 - 鉴权函数
import { token, roles } from '@/api/request';
// 引入 - 路由辅助函数
import { filterAsyncRoutes } from '@/utils';

// state - persmission 模块
const state = {
    token: null,
    // 为什么要单独存起来，因为动态增加的路由不会体现到 router 对象的 options.routes 数组中，会导致导航栏不能动态更新
    routes: constantRoutes,
    asyncRoutes: [],
    // 角色
    roles: [],
    refresh: true // 解决动态路由添加刷新页面后页面白屏问题
};

// getters - persmission 模块
const getters = {
    // 将所有 state 都转换为 getters, 需要特殊设置的单独设置
    PMS_GETTERS(state, getters, rootState, rootGetters) {
        return {
            ...state
        };
    }
};

// mutations - persmission 模块
const mutations = {
    // 将所有不需要经过逻辑处理的赋值, 直接转换为通过数据的 prop 属性设置
    PMS_SET_VALUE(state, res) {
        Object.prototype.hasOwnProperty.call(state, res.prop) && (state[res.prop] = res.data);
    },

    // 异步路由 - 根据角色动态增加增加路由
    PMS_ASYNC_ROUTES(state, roles) {
        state.asyncRoutes = [...filterAsyncRoutes(asyncRoutes, roles), redirect404];
        router.addRoutes(state.asyncRoutes);
    }
};

// actions - persmission 模块
const actions = {
    // 鉴权监测 - token + 角色检测
    async PMS_VALIDATE_AUTH({ commit, dispatch, getters, rootGetters, state, rootState }) {
        if (!state.token) {
            let resToken = await token();
            let resRoles = await roles();
            commit('PMS_SET_VALUE', { prop: 'token', data: resToken.data }); // 保存 token
            commit('PMS_ASYNC_ROUTES', resRoles.data); // 保存 asyncRoutes
        }
    }
};

export default {
    namespaced: true,
    state,
    getters,
    mutations,
    actions
};